#ifndef UTILS_BASE_NOCOPYABLE_H
#define UTILS_BASE_NOCOPYABLE_H

namespace El {

/**
 * @brief Disables the copy and move construct/assignment method.
 */
#define DISALLOW_COPY_AND_MOVE(className) \
    DISALLOW_COPY(className);             \
    DISALLOW_MOVE(className)

/**
 * @brief Disables the copy construct/assignment method.
 */
#define DISALLOW_COPY(className)           \
    className(const className &) = delete; \
    className &operator=(const className &) = delete

/**
 * @brief Disables the move construct/assignment method.
 */
#define DISALLOW_MOVE(className)      \
    className(className &&) = delete; \
    className &operator=(className &&) = delete

} // namespace El

#endif
